package edu.leti.example;
import java.io.IOException;
//import java.io.Console;

public class Core {
	
	/**
	 * Выполняет сортировку от начала до конца
	 * @param size размер будущего массива
	 * @return отсортированный массив
	 * @throws IOException
	 */
	public int [] run(int size) throws IOException{ 
		
		int [] inArray, outArray;
		Heap theHeap;
		
		inArray = formInputArray(size);
		theHeap = buildHeapTree(inArray);
		outArray = getSortedArray(theHeap);
		
		return outArray;
	}

	/**
	 * Создаёт массив из случайных целых чисел от 0 до 100
	 * @param size размер будущего массива
	 * @return созданный неотсортированный массив
	 */
	public int[] formInputArray(int size) {
		int [] random = new int[size];
		
		for (int i = 0; i < size; i++) {
			random[i] = (int) (java.lang.Math.random() * 100);
		}

		System.out.printf("New input array (size = %d): ", size);
		for (int i = 0; i < size; i++) {
			System.out.printf("%d ", random[i]);
		}
		System.out.printf("\n");
		
		return random;
	}
	

	/**
	 * Формирование пирамидадбного дерева, содержащегося в массиве
	 * @param inArray неотсортированный массив
	 * @return массив содержащий пирамиду
	 */
	public Heap buildHeapTree(int[] inArray) {
		Heap theHeap = new Heap(inArray.length);
		
		for (int i = 0; i < inArray.length; i++) {
			MyNode newNode = new MyNode(inArray[i]);
			theHeap.insertAt(i, newNode);
			theHeap.incrementSize();
		}

		System.out.print("Heap (plain presentation): ");
		theHeap.displayArray();
		for (int i = theHeap.getCurrentSize() / 2 - 1; i >= 0; i--)
			theHeap.trickleDown(i);
		
		System.out.print("Heap (tree presentation):   ");
		theHeap.displayArray();
		theHeap.displayHeap();
		
		return theHeap;
	}
	
	/**
	 * Сортировка пирамидального массива
	 * @param theHeap массив содержащий пирамиду
	 * @return отсортированный массив
	 */
	public int[] getSortedArray(Heap theHeap) {
		
		for (int i = theHeap.getCurrentSize() - 1; i >= 0; i--) {
			MyNode biggestNode = theHeap.remove();
			theHeap.insertAt(i, biggestNode);
		}
		
		System.out.print("\nSorted: ");
		theHeap.displayArray();
		
		return theHeap.getArray();
	}


}
	

	

